/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.aspas.beans;


import br.com.aspas.modelo.CursosPessoaFisica;
import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.annotation.Resource;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.naming.InitialContext;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceUnit;
import javax.persistence.Query;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;
import javax.transaction.UserTransaction;
import net.sf.jasperreports.engine.JasperRunManager;


/**
 *
 * @author felipe
 */
public class CertificadosBean {

    @Resource
    private UserTransaction utx = null;
    @PersistenceUnit(unitName = "EventimeDS")
    private EntityManagerFactory emf = null;

    private EntityManager createEntityManager() {
        return emf.createEntityManager();
    }

    public CertificadosBean() {
    }
    private CursosPessoaFisica cursosPessoaFisica;
    private String campoPesquisa;
    private List<CursosPessoaFisica> listCursosPessoaFisica;

    public String getCampoPesquisa() {
        return campoPesquisa;
    }

    public void setCampoPesquisa(String campoPesquisa) {
        this.campoPesquisa = campoPesquisa;
    }

    public List<CursosPessoaFisica> getListCursosPessoaFisica() {
        return listCursosPessoaFisica;
    }

    public void setListCursosPessoaFisica(List<CursosPessoaFisica> listCursosPessoaFisica) {
        this.listCursosPessoaFisica = listCursosPessoaFisica;
    }

    public CursosPessoaFisica getCursosPessoaFisica() {
        return cursosPessoaFisica;
    }

    public void setCursosPessoaFisica(CursosPessoaFisica cursosPessoaFisica) {
        this.cursosPessoaFisica = cursosPessoaFisica;
    }

    public String pesquisar() {
        EntityManager em = createEntityManager();

        if (campoPesquisa.trim().length() == 14) {
            Pattern pattern = Pattern.compile("[0-9]{3}.[0-9]{3}.[0-9]{3}-[0-9]{2}");
            Matcher matcher = pattern.matcher(campoPesquisa);

            if (matcher.find()) {
                Query q = em.createQuery("SELECT p FROM CursosPessoaFisica as p WHERE "
                        + "p.cursosPessoaFisicaPK.pessoaFisica.cpf=:cpf AND p.cursosPessoaFisicaPK.cursos.codigo IN (10,11,12,23,24,25)").setParameter("cpf", campoPesquisa);
                listCursosPessoaFisica = q.getResultList();
                em.close();
            }

        } else {
            Query q1 = em.createQuery("SELECT COUNT(p) FROM CursosPessoaFisica as p WHERE "
                    + "p.cursosPessoaFisicaPK.pessoaFisica.nome LIKE upper(:nome) AND "
                    + "p.cursosPessoaFisicaPK.cursos.codigo IN (10,11,12,23,24,25)").setParameter("nome", campoPesquisa + "%");

            Query q2 = em.createQuery("SELECT COUNT(p) FROM CursosPessoaFisica as p WHERE "
                    + "lower(p.cursosPessoaFisicaPK.cursos.nome) LIKE lower(:nome) AND "
                    + "p.cursosPessoaFisicaPK.cursos.codigo IN (10,11,12,23,24,25)").setParameter("nome", campoPesquisa + "%");

            Long l1 = (Long) q1.getSingleResult();
            Long l2 = (Long) q2.getSingleResult();

            if (l1 > l2) {
                q1 = em.createQuery("SELECT p FROM CursosPessoaFisica as p WHERE "
                        + "p.cursosPessoaFisicaPK.pessoaFisica.nome LIKE upper(:nome) AND "
                        + "p.cursosPessoaFisicaPK.cursos.codigo IN (10,11,12,23,24,25) "
                        + "ORDER BY "
                        + "p.cursosPessoaFisicaPK.cursos.dataCurso ASC, "
                        + "p.cursosPessoaFisicaPK.pessoaFisica.nome ASC").setParameter("nome", campoPesquisa + "%");
                listCursosPessoaFisica = q1.getResultList();
            } else {
                q2 = em.createQuery("SELECT p FROM CursosPessoaFisica as p WHERE "
                        + "lower(p.cursosPessoaFisicaPK.cursos.nome) LIKE lower(:nome) AND "
                        + "p.cursosPessoaFisicaPK.cursos.codigo IN (10,11,12,23,24,25) "
                        + "ORDER BY "
                        + "p.cursosPessoaFisicaPK.cursos.dataCurso ASC, "
                        + "p.cursosPessoaFisicaPK.pessoaFisica.nome ASC").setParameter("nome", campoPesquisa + "%");
                listCursosPessoaFisica = q2.getResultList();
            }
            em.close();

        }
        return null;
    }

    public void gerarCertificado() {

        byte[] bytes = null;
        try {
            DataSource ds = (DataSource) new InitialContext().lookup("jdbc/Aspas");

            Map parametros = new HashMap();
//            parametros.put("CODIGO", cursosPessoaFisica.getCursosPessoaFisicaPK().getPessoaFisica().getCodigo());
//            parametros.put("CURSO", cursosPessoaFisica.getCursosPessoaFisicaPK().getCursos().getCodigo());
            parametros.put("REPORT_CONNECTION", ds.getConnection());
            File file = new File("/opt/certificado_aspas.jasper");
            bytes = JasperRunManager.runReportToPdf(file.getPath(), parametros);

            ExternalContext econtext = FacesContext.getCurrentInstance().getExternalContext();

            HttpServletResponse response = (HttpServletResponse) econtext.getResponse();

            if (bytes != null && bytes.length > 0) {
                response.setContentType("application/pdf");
                response.setContentLength(bytes.length);
                ServletOutputStream ouputStream = response.getOutputStream();
                ouputStream.write(bytes, 0, bytes.length);
                ouputStream.flush();
                ouputStream.close();
                FacesContext.getCurrentInstance().responseComplete();
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}




